class PromiseChain {
    constructor() {
        this.promiseEvent = []
    }

    add({ targetName, targetFn }) {
        // 如果校验未通过，直接不让走了
        if (!this.validateIsPromise(targetFn)) return

        this.promiseEvent.push({ targetName, targetFn })

        return this;
    }

    start({ targetName, params }) {
        let index = 0, length = this.promiseEvent.length
        if (targetName) {
            // 找到想第一个执行的 promise 方法，这里使用了 Math.max 来简化方法
            index = Math.max(this.promiseEvent.findIndex((item) => item.targetName === targetName), index)
        }
        index = findIndex >= 0 ? findIndex : index

        this.promiseEvent.slice(index, length).reduce((prevResult, currentPromise) => {
            return prevResult.then(() => currentPromise.targetFn())
        }, Promise.resolve(params || 0))
    }


    validateIsPromise(promiseFn) {
        // 判断是否为空，且是 Promise 方法
        return promiseFn && this.isPromise(fn)

    }

    isPromise(fn) {
        // 判断是否是一个 promise
        return fn.then && fn.catch && fn.finally
    }
}